home *** CD-ROM | disk | FTP | other *** search
- package com.ibm.xml.framework;
-
- import java.io.IOException;
- import java.io.InputStream;
-
- public final class ChunkyByteArray extends InputStream {
- private static final int CHUNK_SHIFT = 14;
- private static final int CHUNK_SIZE = 16384;
- private static final int CHUNK_MASK = 16383;
- private static final int INITIAL_CHUNK_COUNT = 64;
- private InputStream fInputStream;
- private byte[][] fData = new byte[64][];
- private int fLength;
- private int fOffset;
-
- public ChunkyByteArray(InputStream var1) throws IOException {
- this.fInputStream = var1;
- this.fill();
- }
-
- public int read() throws IOException {
- if (this.fData == null) {
- return this.fInputStream == null ? -1 : this.fInputStream.read();
- } else {
- byte var1 = this.fData[0][this.fOffset];
- if (++this.fOffset == this.fLength) {
- this.fData = null;
- if (this.fLength < 16384) {
- this.fInputStream = null;
- }
- }
-
- return var1;
- }
- }
-
- public int read(byte[] var1, int var2, int var3) throws IOException {
- int var4 = this.fLength - this.fOffset;
- if (var4 == 0) {
- return this.fInputStream == null ? -1 : this.fInputStream.read(var1, var2, var3);
- } else if (var3 <= 0) {
- return 0;
- } else {
- byte[] var5 = this.fData[0];
- if (var3 >= var4) {
- var3 = var4;
- if (this.fLength < 16384) {
- this.fInputStream = null;
- }
- }
-
- if (var1 == null) {
- this.fOffset += var3;
- return var3;
- } else {
- int var6 = var2 + var3;
-
- do {
- var1[var2++] = var5[this.fOffset++];
- } while(var2 < var6);
-
- return var3;
- }
- }
- }
-
- public void rewind() {
- this.fOffset = 0;
- }
-
- private void fill() throws IOException {
- int var1 = this.fLength >> 14;
- byte[] var2 = new byte[16384];
- this.fData[var1] = var2;
- int var3 = 0;
- int var4 = 16384;
- int var5 = 0;
-
- do {
- var5 = this.fInputStream.read(var2, var3, var4);
- if (var5 == -1) {
- var2[var3] = -1;
- this.fInputStream.close();
- this.fInputStream = null;
- return;
- }
-
- if (var5 > 0) {
- this.fLength += var5;
- var3 += var5;
- var4 -= var5;
- }
- } while(var4 > 0);
-
- }
-
- public byte byteAt(int var1) {
- int var2 = var1 >> 14;
- int var3 = var1 & 16383;
-
- try {
- return this.fData[var2][var3];
- } catch (NullPointerException var5) {
- try {
- if (var3 == 0) {
- this.fill();
- return this.fData[var2][var3];
- } else {
- return 0;
- }
- } catch (IOException var4) {
- return 0;
- }
- }
- }
-
- public boolean atEOF(int var1) {
- return var1 > this.fLength;
- }
-
- public void checkEOF(int var1) {
- if (var1 > this.fLength) {
- throw new ArrayIndexOutOfBoundsException();
- }
- }
- }
-